package store.lunangangster.engine.impl.cmd;

import store.lunangangster.engine.impl.interceptor.CommandInterceptor;

public interface CommandExecutor {

  /**
   * 执行指定命令的方法，所有方法的执行都会经过一系列的CommandInterceptor
   * @param command   待执行的命令
   * @return          执行结果
   */
  <T> T execute(Command<T> command);

  /**
   * 将指定拦截器作为链首
   * @param head  待加入的拦截器
   */
  void setHead(CommandInterceptor head);

  /**
   * 该方法会将CommandInterceptor添加到CommandExecutor中的拦截器链尾，其余拦截器位置不变
   * @param interceptor   待加入的拦截器
   */
  void addInterceptor(CommandInterceptor interceptor);
}
